home *** CD-ROM | disk | FTP | other *** search
/ The Utilities Experience / The Utilities Experience - Volume 1.iso / software / emulation / frodo / src / prefs.c < prev    next >
C/C++ Source or Header  |  1996-01-29  |  26KB  |  882 lines

  1. /*
  2.  *  Prefs.c - Handhabung des Einstellungsfensters
  3.  *
  4.  *  Copyright (C) 1994-1996 by Christian Bauer
  5.  */
  6.  
  7. #include <exec/types.h>
  8. #include <intuition/gadgetclass.h>
  9. #include <graphics/displayinfo.h>
  10. #include <workbench/workbench.h>
  11. #include <libraries/asl.h>
  12. #include <libraries/gadtools.h>
  13. #include <clib/exec_protos.h>
  14. #include <clib/dos_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <clib/graphics_protos.h>
  17. #include <clib/gadtools_protos.h>
  18. #include <clib/asl_protos.h>
  19. #include <clib/icon_protos.h>
  20. #include <string.h>
  21.  
  22. #include "Prefs.h"
  23. #include "FrodoGUI.h"
  24. #include "Frodo_rev.h"
  25. #define CATCOMP_NUMBERS 1
  26. #include "LocStrings.h"
  27.  
  28.  
  29. // Aus Main.asm
  30. extern char *GetStr(int strnum);
  31. extern short PrefsFromEmul;
  32. extern char PrefsName[256];
  33. extern USHORT IsDraco;
  34.  
  35. // Aus 6510(SC).asm
  36. extern USHORT IsFrodoSC;
  37.  
  38.  
  39. // Prototypes
  40. void set_gadgets(Preferences *p);
  41. void set_display_id_gadget(Preferences *p);
  42. void get_gadgets(Preferences *p);
  43. void ghost_gadgets(Preferences *p);
  44. int handle_IDCMP(Preferences *p, struct Window *win, int done);
  45. int handle_gadget(Preferences *p, struct Window *win, struct Gadget *gad, UWORD code, int done);
  46. int handle_menu(Preferences *p, struct Window *win, int menu, int item, int done);
  47. int handle_key(Preferences *p, struct Window *win, UWORD code, int done);
  48. int request_display_id(struct Window *win, ULONG *display_id, UWORD *overscan);
  49. int request_drive(struct Window *win, UWORD type, char *str);
  50. int request_file(struct Window *win, char *name, int hail, int save);
  51. void open_prefs_as(Preferences *p);
  52. void save_prefs(Preferences *p);
  53. void save_prefs_as(Preferences *p);
  54.  
  55.  
  56. // Requester
  57. struct EasyStruct about_req = {
  58.   sizeof(struct EasyStruct), 0, NULL, NULL, NULL
  59. };
  60.  
  61.  
  62. // Icon der Prefs-Datei
  63. const UWORD PrefsI1Data[] =
  64. {
  65. /* Plane 0 */
  66.     0x0000,0x0000,0x0000,0x0400,0x0000,0x0000,0x0000,0x0C00,
  67.     0x0003,0xFFC0,0x0000,0x0C00,0x000C,0x0030,0x0000,0x0C00,
  68.     0x0010,0x7E08,0x0000,0x0C00,0x0020,0x8104,0x0000,0x0C00,
  69.     0x0020,0x4104,0x0000,0x0C00,0x0020,0x4104,0x0000,0x0C00,
  70.     0x0010,0x8204,0x0000,0x0C00,0x000F,0x0C08,0x0000,0x0C00,
  71.     0x0000,0x3010,0x0000,0x0C00,0x0000,0x4060,0x0000,0x0C00,
  72.     0x0000,0x8180,0x0000,0x0C00,0x0001,0x0E00,0x0000,0x0C00,
  73.     0x0000,0x8400,0x0000,0x0C00,0x0000,0x7800,0x0000,0x0C00,
  74.     0x0000,0x8400,0x0000,0x0C00,0x0000,0x8400,0x0000,0x0C00,
  75.     0x0000,0x7800,0x0000,0x0C00,0x0000,0x0000,0x0000,0x0C00,
  76.     0x0000,0x0000,0x0000,0x0C00,0x7FFF,0xFFFF,0xFFFF,0xFC00,
  77. /* Plane 1 */
  78.     0xFFFF,0xFFFF,0xFFFF,0xF800,0xD555,0x5557,0xD555,0x5000,
  79.     0xD554,0x001F,0xF555,0x5000,0xD553,0xFFCF,0xF555,0x5000,
  80.     0xD54F,0x81F7,0xF555,0x5000,0xD55F,0x54FB,0xF555,0x5000,
  81.     0xD55F,0x94FB,0xFFD5,0x5000,0xD55F,0x94F9,0x7FF5,0x5000,
  82.     0xD54F,0x55F9,0x7FD5,0x5000,0xD550,0x53F5,0x7FD5,0x5000,
  83.     0xD555,0x4FE5,0x5F55,0x5000,0xD555,0x3F95,0x60D5,0x5000,
  84.     0xD555,0x7E7D,0x6055,0x5000,0xD554,0xF1FD,0x6035,0x5000,
  85.     0xD555,0x79FF,0xFFD5,0x5000,0xD555,0x05FF,0xF555,0x5000,
  86.     0xD555,0x797F,0xF555,0x5000,0xD555,0x797F,0xF555,0x5000,
  87.     0xD555,0x055F,0xF555,0x5000,0xD555,0x5557,0xD555,0x5000,
  88.     0xD555,0x5555,0x5555,0x5000,0x8000,0x0000,0x0000,0x0000,
  89. /* Plane 2 */
  90.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  91.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  92.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  93.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  94.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  95.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  96.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  97.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  98.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  99.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  100.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  101. /* Plane 3 */
  102.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  103.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  104.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  105.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  106.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  107.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  108.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  109.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  110.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  111.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  112.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  113. /* Plane 4 */
  114.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  115.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  116.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  117.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  118.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  119.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  120.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  121.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  122.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  123.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  124.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  125. /* Plane 5 */
  126.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  127.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  128.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  129.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  130.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  131.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  132.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  133.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  134.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  135.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  136.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  137. /* Plane 6 */
  138.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  139.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  140.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  141.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  142.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  143.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  144.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  145.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  146.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  147.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  148.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  149. /* Plane 7 */
  150.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  151.     0x0000,0x0007,0xC000,0x0000,0x0000,0x000F,0xE000,0x0000,
  152.     0x0000,0x0007,0xE000,0x0000,0x0000,0x0003,0xE000,0x0000,
  153.     0x0000,0x0000,0x6000,0x0000,0x0000,0x0000,0x1FC0,0x0000,
  154.     0x0000,0x0000,0x1F80,0x0000,0x0000,0x0000,0x1F00,0x0000,
  155.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1F00,0x0000,
  156.     0x0000,0x0070,0x1F80,0x0000,0x0000,0x00F0,0x1FC0,0x0000,
  157.     0x0000,0x00FC,0x6000,0x0000,0x0000,0x007F,0xE000,0x0000,
  158.     0x0000,0x003F,0xE000,0x0000,0x0000,0x001F,0xE000,0x0000,
  159.     0x0000,0x0007,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,
  160.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  161. };
  162.  
  163. const struct Image PrefsI1 =
  164. {
  165.     0, 0,            /* Upper left corner */
  166.     54, 22, 8,        /* Width, Height, Depth */
  167.     PrefsI1Data,    /* Image data */
  168.     0x00FF, 0x0000,    /* PlanePick, PlaneOnOff */
  169.     NULL            /* Next image */
  170. };
  171.  
  172. const struct DiskObject PrefsIcon =
  173. {
  174.     WB_DISKMAGIC,        /* Magic Number */
  175.     WB_DISKVERSION,        /* Version */
  176.     {                    /* Embedded Gadget Structure */
  177.     NULL,                /* Next Gadget Pointer */
  178.     0, 0, 54, 23,        /* Left,Top,Width,Height */
  179.     GFLG_GADGIMAGE | GFLG_GADGHCOMP,    /* Flags */
  180.     GACT_RELVERIFY,        /* Activation Flags */
  181.     BOOLGADGET,            /* Gadget Type */
  182.     (APTR)&PrefsI1,        /* Render Image */
  183.     NULL,                /* Select Image */
  184.     NULL,                /* Gadget Text */
  185.     NULL,                /* Mutual Exclude */
  186.     NULL,                /* Special Info */
  187.     0,                    /* Gadget ID */
  188.     (APTR) 0x0001,        /* User Data (Revision) */
  189.     },
  190.     WBPROJECT,            /* Icon Type */
  191.     (char *)"Frodo",    /* Default Tool */
  192.     NULL,                /* Tool Type Array */
  193.     NO_ICON_POSITION,    /* Current X */
  194.     NO_ICON_POSITION,    /* Current Y */
  195.     NULL,                /* Drawer Structure */
  196.     NULL,                /* Tool Window */
  197.     0                    /* Stack Size */
  198. };
  199.  
  200.  
  201. /*
  202.  *  Einstellungsfenster öffnen, handhaben und schließen
  203.  *  Die Preferences werden auf jeden Fall verändert, auch bei Cancel
  204.  *  0: Cancel, 1: OK
  205.  */
  206.  
  207. int DoThePrefs(Preferences *p)
  208. {
  209.   int done = FALSE;
  210.  
  211.   if (!SetupScreen()) {
  212.     if (!OpenPrefsWindow()) {
  213.       SetWindowTitles(PrefsWnd,
  214.         GetStr(IsFrodoSC ? MSG_PREFSTITLESC : MSG_PREFSTITLE),
  215.         GetStr(IsFrodoSC ? MSG_SCREENTITLESC : MSG_SCREENTITLE));
  216.  
  217.       set_gadgets(p);
  218.  
  219.       // ScreenReqWindow, DirReqWindow, FileReqWindow setzen
  220.       while (!done) {
  221.         WaitPort(PrefsWnd->UserPort);
  222.         done = handle_IDCMP(p, PrefsWnd, done);
  223.       }
  224.       if (done == -1) done = 0;
  225.  
  226.       get_gadgets(p);
  227.  
  228.       ClosePrefsWindow();
  229.     }
  230.     CloseDownScreen();
  231.   }
  232.  
  233.   return done;
  234. }
  235.  
  236.  
  237. /*
  238.  *  Gadgets auf die Einstellungen setzen
  239.  */
  240.  
  241. void set_gadgets(Preferences *p)
  242. {
  243.   GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL,
  244.     GTIN_Number, p->normal_cycles, TAG_DONE);
  245.   GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL,
  246.     GTIN_Number, p->bad_line_cycles, TAG_DONE);
  247.   GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL,
  248.     GTIN_Number, p->CIA_cycles, TAG_DONE);
  249.   GT_SetGadgetAttrs(PrefsGadgets[GDX_SkipLatch], PrefsWnd, NULL,
  250.     GTIN_Number, p->skip_latch, TAG_DONE);
  251.  
  252.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick1On], PrefsWnd, NULL,
  253.     GTCB_Checked, p->joystick_1_on, TAG_DONE);
  254.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick2On], PrefsWnd, NULL,
  255.     GTCB_Checked, p->joystick_2_on, TAG_DONE);
  256.   GT_SetGadgetAttrs(PrefsGadgets[GDX_JoystickSwap], PrefsWnd, NULL,
  257.     GTCB_Checked, p->joystick_swap, TAG_DONE);
  258.   GT_SetGadgetAttrs(PrefsGadgets[GDX_KeyboardYZ], PrefsWnd, NULL,
  259.     GTCB_Checked, p->keyboard_yz, TAG_DONE);
  260.   GT_SetGadgetAttrs(PrefsGadgets[GDX_SpritesOn], PrefsWnd, NULL,
  261.     GTCB_Checked, p->sprites_on, TAG_DONE);
  262.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Collisions], PrefsWnd, NULL,
  263.     GTCB_Checked, p->collisions, TAG_DONE);
  264.   GT_SetGadgetAttrs(PrefsGadgets[GDX_FastReset], PrefsWnd, NULL,
  265.     GTCB_Checked, p->fast_reset, TAG_DONE);
  266.   GT_SetGadgetAttrs(PrefsGadgets[GDX_LimitSpeed], PrefsWnd, NULL,
  267.     GTCB_Checked, p->limit_speed, TAG_DONE);
  268.   GT_SetGadgetAttrs(PrefsGadgets[GDX_DirectVideo], PrefsWnd, NULL,
  269.     GTCB_Checked, p->direct_video, TAG_DONE);
  270.   GT_SetGadgetAttrs(PrefsGadgets[GDX_OtherIEC], PrefsWnd, NULL,
  271.     GTCB_Checked, p->other_IEC, TAG_DONE);
  272.   GT_SetGadgetAttrs(PrefsGadgets[GDX_MapSlash], PrefsWnd, NULL,
  273.     GTCB_Checked, p->map_slash, TAG_DONE);
  274.  
  275.   GT_SetGadgetAttrs(PrefsGadgets[GDX_SIDType], PrefsWnd, NULL,
  276.     GTCY_Active, p->SID_type, TAG_DONE);
  277.   GT_SetGadgetAttrs(PrefsGadgets[GDX_ScreenType], PrefsWnd, NULL,
  278.     GTCY_Active, p->screen_type, TAG_DONE);
  279.  
  280.   set_display_id_gadget(p);
  281.  
  282.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv8Type], PrefsWnd, NULL,
  283.     GTCY_Active, p->drv_8_type, TAG_DONE);
  284.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv9Type], PrefsWnd, NULL,
  285.     GTCY_Active, p->drv_9_type, TAG_DONE);
  286.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv10Type], PrefsWnd, NULL,
  287.     GTCY_Active, p->drv_10_type, TAG_DONE);
  288.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Drv11Type], PrefsWnd, NULL,
  289.     GTCY_Active, p->drv_11_type, TAG_DONE);
  290.  
  291.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir8], PrefsWnd, NULL,
  292.     GTST_String, p->dir_8, TAG_DONE);
  293.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir9], PrefsWnd, NULL,
  294.     GTST_String, p->dir_9, TAG_DONE);
  295.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir10], PrefsWnd, NULL,
  296.     GTST_String, p->dir_10, TAG_DONE);
  297.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir11], PrefsWnd, NULL,
  298.     GTST_String, p->dir_11, TAG_DONE);
  299.  
  300.   ghost_gadgets(p);
  301. }
  302.  
  303.  
  304. /*
  305.  *  Display-ID-Gadget setzen
  306.  */
  307.  
  308. char mode_name[DISPLAYNAMELEN];
  309.  
  310. void set_display_id_gadget(Preferences *p)
  311. {
  312.   struct NameInfo query;
  313.  
  314.   GetDisplayInfoData(NULL, (UBYTE *)&query, sizeof(query), DTAG_NAME, p->display_id);
  315.   strncpy(mode_name, query.Name, DISPLAYNAMELEN);
  316.  
  317.   GT_SetGadgetAttrs(PrefsGadgets[GDX_DisplayID], PrefsWnd, NULL,
  318.     GTTX_Text, mode_name, TAG_DONE);
  319. }
  320.  
  321.  
  322. /*
  323.  *  Einstellungen aus den Gadgets lesen
  324.  */
  325.  
  326. void get_gadgets(Preferences *p)
  327. {
  328.   p->normal_cycles = GetNumber(PrefsGadgets[GDX_NormalCycles]);
  329.   p->bad_line_cycles = GetNumber(PrefsGadgets[GDX_BadLineCycles]);
  330.   p->CIA_cycles = GetNumber(PrefsGadgets[GDX_CIACycles]);
  331.   p->skip_latch = GetNumber(PrefsGadgets[GDX_SkipLatch]);
  332.  
  333.   strncpy(p->dir_8, GetString(PrefsGadgets[GDX_Dir8]), 256);
  334.   strncpy(p->dir_9, GetString(PrefsGadgets[GDX_Dir9]), 256);
  335.   strncpy(p->dir_10, GetString(PrefsGadgets[GDX_Dir10]), 256);
  336.   strncpy(p->dir_11, GetString(PrefsGadgets[GDX_Dir11]), 256);
  337. }
  338.  
  339.  
  340. /*
  341.  *  Gadgets korrekt ghosten
  342.  */
  343.  
  344. void ghost_gadgets(Preferences *p)
  345. {
  346.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir8], PrefsWnd, NULL,
  347.     GA_Disabled, p->drv_8_type == DRVTYPE_IEC, TAG_DONE);
  348.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir9], PrefsWnd, NULL,
  349.     GA_Disabled, p->drv_9_type == DRVTYPE_IEC, TAG_DONE);
  350.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir10], PrefsWnd, NULL,
  351.     GA_Disabled, p->drv_10_type == DRVTYPE_IEC, TAG_DONE);
  352.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir11], PrefsWnd, NULL,
  353.     GA_Disabled, p->drv_11_type == DRVTYPE_IEC, TAG_DONE);
  354.  
  355.   GT_SetGadgetAttrs(PrefsGadgets[GDX_Collisions], PrefsWnd, NULL,
  356.     GA_Disabled, p->screen_type == SCRTYPE_1BIT, TAG_DONE);
  357.   GT_SetGadgetAttrs(PrefsGadgets[GDX_DirectVideo], PrefsWnd, NULL,
  358.     GA_Disabled, (p->screen_type != SCRTYPE_8BIT) || PrefsFromEmul, TAG_DONE);
  359.  
  360.   GT_SetGadgetAttrs(PrefsGadgets[GDX_GetDisplayID], PrefsWnd, NULL,
  361.     GA_Disabled, PrefsFromEmul, TAG_DONE);
  362.   GT_SetGadgetAttrs(PrefsGadgets[GDX_ScreenType], PrefsWnd, NULL,
  363.     GA_Disabled, PrefsFromEmul, TAG_DONE);
  364.  
  365.   if (IsFrodoSC) {
  366.     GT_SetGadgetAttrs(PrefsGadgets[GDX_ScreenType], PrefsWnd, NULL,
  367.       GA_Disabled, TRUE, TAG_DONE);
  368.     GT_SetGadgetAttrs(PrefsGadgets[GDX_Collisions], PrefsWnd, NULL,
  369.       GA_Disabled, TRUE, TAG_DONE);
  370.     GT_SetGadgetAttrs(PrefsGadgets[GDX_NormalCycles], PrefsWnd, NULL,
  371.       GA_Disabled, TRUE, TAG_DONE);
  372.     GT_SetGadgetAttrs(PrefsGadgets[GDX_BadLineCycles], PrefsWnd, NULL,
  373.       GA_Disabled, TRUE, TAG_DONE);
  374.     GT_SetGadgetAttrs(PrefsGadgets[GDX_CIACycles], PrefsWnd, NULL,
  375.       GA_Disabled, TRUE, TAG_DONE);
  376.     GT_SetGadgetAttrs(PrefsGadgets[GDX_DirectVideo], PrefsWnd, NULL,
  377.       GA_Disabled, TRUE, TAG_DONE);
  378.   }
  379.  
  380.   if (IsDraco) {
  381.     GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick1On], PrefsWnd, NULL,
  382.       GA_Disabled, TRUE, TAG_DONE);
  383.     GT_SetGadgetAttrs(PrefsGadgets[GDX_Joystick2On], PrefsWnd, NULL,
  384.       GA_Disabled, TRUE, TAG_DONE);
  385.   }
  386. }
  387.  
  388.  
  389. /*
  390.  *  IDCMP-Messages eines Fensters handhaben
  391.  *  -1: Cancel, 1: OK, 0: weitermachen
  392.  */
  393.  
  394. int handle_IDCMP(Preferences *p, struct Window *win, int done)
  395. {
  396.   struct IntuiMessage *msg;
  397.   ULONG class;
  398.   UWORD code;
  399.   UWORD menu_number;
  400.   struct Gadget *gad;
  401.   struct MenuItem *item;
  402.  
  403.   while (!done && (msg = GT_GetIMsg(win->UserPort))) {
  404.     class = msg->Class;
  405.     code = msg->Code;
  406.     gad = (struct Gadget *)msg->IAddress;
  407.  
  408.     GT_ReplyIMsg(msg);
  409.  
  410.     switch (class) {
  411.       case IDCMP_GADGETUP:
  412.         done = handle_gadget(p, win, gad, code, done);
  413.         break;
  414.  
  415.       case IDCMP_MENUPICK:
  416.         menu_number = code;
  417.         while (!done && (menu_number != MENUNULL)) {
  418.           item = ItemAddress(win->MenuStrip, menu_number);
  419.           done = handle_menu(p, win, MENUNUM(menu_number), ITEMNUM(menu_number), done);
  420.           menu_number = item->NextSelect;
  421.         }
  422.         break;
  423.  
  424.       case IDCMP_VANILLAKEY:
  425.         done = handle_key(p, win, code, done);
  426.         break;
  427.  
  428.       case IDCMP_REFRESHWINDOW:
  429.         GT_BeginRefresh(win);
  430.         GT_EndRefresh(win, TRUE);
  431.         break;
  432.     }
  433.   }
  434.  
  435.   return done;
  436. }
  437.  
  438.  
  439. /*
  440.  *  Gadget wurde betätigt
  441.  *  -1: Cancel, 1: OK, 0: weitermachen
  442.  */
  443.  
  444. int handle_gadget(Preferences *p, struct Window *win, struct Gadget *gad, UWORD code, int done)
  445. {
  446.   switch (gad->GadgetID) {
  447.     case GD_OK:
  448.       done = 1;
  449.       break;
  450.  
  451.     case GD_Cancel:
  452.       done = -1;
  453.       break;
  454.  
  455.     case GD_Save:
  456.       save_prefs(p);
  457.       break;
  458.  
  459.     case GD_Joystick1On:
  460.       p->joystick_1_on = p->joystick_1_on ? 0 : -1;
  461.       break;
  462.  
  463.     case GD_Joystick2On:
  464.       p->joystick_2_on = p->joystick_2_on ? 0 : -1;
  465.       break;
  466.  
  467.     case GD_JoystickSwap:
  468.       p->joystick_swap = p->joystick_swap ? 0 : -1;
  469.       break;
  470.  
  471.     case GD_SIDType:
  472.       p->SID_type = code;
  473.       break;
  474.  
  475.     case GD_OtherIEC:
  476.       p->other_IEC = p->other_IEC ? 0 : -1;
  477.       break;
  478.  
  479.     case GD_KeyboardYZ:
  480.       p->keyboard_yz = p->keyboard_yz ? 0 : -1;
  481.       break;
  482.  
  483.     case GD_SpritesOn:
  484.       p->sprites_on = p->sprites_on ? 0 : -1;
  485.       break;
  486.  
  487.     case GD_Collisions:
  488.       p->collisions = p->collisions ? 0 : -1;
  489.       break;
  490.  
  491.     case GD_MapSlash:
  492.       p->map_slash = p->map_slash ? 0 : -1;
  493.       break;
  494.  
  495.     case GD_FastReset:
  496.       p->fast_reset = p->fast_reset ? 0 : -1;
  497.       break;
  498.  
  499.     case GD_LimitSpeed:
  500.       p->limit_speed = p->limit_speed ? 0 : -1;
  501.       break;
  502.  
  503.     case GD_DirectVideo:
  504.       if (!PrefsFromEmul)
  505.         p->direct_video = p->direct_video ? 0 : -1;
  506.       break;
  507.  
  508.     case GD_ScreenType:
  509.       if (!PrefsFromEmul)
  510.         p->screen_type = code;
  511.       ghost_gadgets(p);
  512.       break;
  513.  
  514.     case GD_GetDisplayID:
  515.       if (!PrefsFromEmul)
  516.         if (request_display_id(win, &p->display_id, &p->overscan))
  517.           set_display_id_gadget(p);
  518.       break;
  519.  
  520.     case GD_Drv8Type:
  521.       p->drv_8_type = code;
  522.       ghost_gadgets(p);
  523.       break;
  524.  
  525.     case GD_Drv9Type:
  526.       p->drv_9_type = code;
  527.       ghost_gadgets(p);
  528.       break;
  529.  
  530.     case GD_Drv10Type:
  531.       p->drv_10_type = code;
  532.       ghost_gadgets(p);
  533.       break;
  534.  
  535.     case GD_Drv11Type:
  536.       p->drv_11_type = code;
  537.       ghost_gadgets(p);
  538.       break;
  539.  
  540.     case GD_GetDir8:
  541.       strncpy(p->dir_8, GetString(PrefsGadgets[GDX_Dir8]), 256);
  542.       if (request_drive(win, p->drv_8_type, p->dir_8))
  543.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir8], PrefsWnd, NULL,
  544.           GTST_String, p->dir_8, TAG_DONE);
  545.       break;
  546.  
  547.     case GD_GetDir9:
  548.       strncpy(p->dir_9, GetString(PrefsGadgets[GDX_Dir9]), 256);
  549.       if (request_drive(win, p->drv_9_type, p->dir_9))
  550.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir9], PrefsWnd, NULL,
  551.           GTST_String, p->dir_9, TAG_DONE);
  552.       break;
  553.  
  554.     case GD_GetDir10:
  555.       strncpy(p->dir_10, GetString(PrefsGadgets[GDX_Dir10]), 256);
  556.       if (request_drive(win, p->drv_10_type, p->dir_10))
  557.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir10], PrefsWnd, NULL,
  558.           GTST_String, p->dir_10, TAG_DONE);
  559.       break;
  560.  
  561.     case GD_GetDir11:
  562.       strncpy(p->dir_11, GetString(PrefsGadgets[GDX_Dir11]), 256);
  563.       if (request_drive(win, p->drv_11_type, p->dir_11))
  564.         GT_SetGadgetAttrs(PrefsGadgets[GDX_Dir11], PrefsWnd, NULL,
  565.           GTST_String, p->dir_11, TAG_DONE);
  566.       break;
  567.   }
  568.  
  569.   return done;
  570. }
  571.  
  572.  
  573. /*
  574.  *  Menü wurde ausgewählt
  575.  *  -1: Cancel, 1: OK, 0: weitermachen
  576.  */
  577.  
  578. int handle_menu(Preferences *p, struct Window *win, int menu, int item, int done)
  579. {
  580.   if (menu == 0) {
  581.     switch (item) {
  582.       case 0:        // Open
  583.         open_prefs_as(p);
  584.         break;
  585.  
  586.       case 2:        // Save
  587.         save_prefs(p);
  588.         break;
  589.  
  590.       case 3:        // Save As
  591.         save_prefs_as(p);
  592.         break;
  593.  
  594.       case 5:        // About
  595.         EasyRequest(win, &about_req, NULL, VERSION, REVISION);
  596.         break;
  597.  
  598.       case 7:        // OK
  599.         done = 1;
  600.         break;
  601.  
  602.       case 8:        // Cancel
  603.         done = -1;
  604.         break;
  605.     }
  606.   }
  607.  
  608.   return done;
  609. }
  610.  
  611.  
  612. /*
  613.  *  Taste wurde gedrückt
  614.  *  -1: Cancel, 1: OK, 0: weitermachen
  615.  */
  616.  
  617. int handle_key(Preferences *p, struct Window *win, UWORD code, int done)
  618. {
  619.   switch (code) {
  620.     case 'o':        // OK
  621.     case 'O':
  622.       done = 1;
  623.       break;
  624.  
  625.     case 'c':        // Cancel
  626.     case 'C':
  627.       done = -1;
  628.       break;
  629.  
  630.     case 's':
  631.     case 'S':
  632.       save_prefs(p);
  633.       break;
  634.   }
  635.  
  636.   return done;
  637. }
  638.  
  639.  
  640. /*
  641.  *  Screenmode-Requester
  642.  *  FALSE: Cancel, TRUE: OK
  643.  */
  644.  
  645. int request_display_id(struct Window *win, ULONG *display_id, UWORD *overscan)
  646. {
  647.   struct ScreenModeRequester *sm;
  648.   int result = FALSE;
  649.  
  650.   if (sm = AllocAslRequestTags(ASL_ScreenModeRequest,
  651.     ASLSM_TitleText, GetStr(MSG_SCREENHAIL),
  652.     ASLSM_Window, win,
  653.     ASLSM_SleepWindow, TRUE,
  654.     ASLSM_PropertyMask, DIPF_IS_HAM | DIPF_IS_EXTRAHALFBRITE | DIPF_IS_DUALPF,
  655.     ASLSM_PropertyFlags, 0,
  656.     ASLSM_InitialDisplayID, *display_id,
  657.     ASLSM_InitialOverscanType, *overscan,
  658.     TAG_DONE)) {
  659.  
  660.     if (result = AslRequest(sm, NULL)) {
  661.       *display_id = sm->sm_DisplayID;
  662.       *overscan = sm->sm_OverscanType;
  663.     }
  664.  
  665.     FreeAslRequest(sm);
  666.   }
  667.  
  668.   return result;
  669. }
  670.  
  671.  
  672. /*
  673.  *  Requester für Verzeichnis/.d64-Datei
  674.  *  FALSE: Cancel, TRUE: OK
  675.  */
  676.  
  677. int request_drive(struct Window *win, UWORD type, char *str)
  678. {
  679.   struct FileRequester *fr;
  680.   int result = FALSE;
  681.  
  682.   if (type == DRVTYPE_D64) {
  683.     return request_file(win, str, MSG_D64HAIL, FALSE);
  684.  
  685.   } else {
  686.     if (fr = AllocAslRequestTags(ASL_FileRequest,
  687.       ASLFR_TitleText, GetStr(MSG_DIRHAIL),
  688.       ASLFR_InitialDrawer, str,
  689.       ASLFR_Window, win,
  690.       ASLFR_SleepWindow, TRUE,
  691.       ASLFR_Flags2, FRF_REJECTICONS | FRF_DRAWERSONLY,
  692.       TAG_DONE)) {
  693.  
  694.       if (result = AslRequest(fr, NULL))
  695.         strncpy(str, fr->fr_Drawer, 256);
  696.  
  697.       FreeAslRequest(fr);
  698.     }
  699.   }
  700.  
  701.   return result;
  702. }
  703.  
  704.  
  705. /*
  706.  *  Einfacher Dateirequester
  707.  *  FALSE: Cancel, TRUE: OK
  708.  */
  709.  
  710. int request_file(struct Window *win, char *name, int hail, int save)
  711. {
  712.   struct FileRequester *fr;
  713.   int result = FALSE;
  714.   char dir[256];
  715.   char file[256];
  716.   char *s;
  717.  
  718.   // Pfad und Dateinamen aufteilen (dir, file)
  719.   strcpy(dir, name);
  720.   s = FilePart(dir);
  721.   strcpy(file, s);
  722.   *s = 0;
  723.  
  724.   if (fr = AllocAslRequestTags(ASL_FileRequest,
  725.     ASLFR_TitleText, GetStr(hail),
  726.     ASLFR_Window, win,
  727.     ASLFR_SleepWindow, TRUE,
  728.     ASLFR_InitialDrawer, dir,
  729.     ASLFR_InitialFile, file,
  730.     ASLFR_Flags1, save ? FRF_DOSAVEMODE : 0,
  731.     ASLFR_Flags2, FRF_REJECTICONS,
  732.     TAG_DONE)) {
  733.  
  734.     if (result = AslRequest(fr, NULL)) {
  735.       strncpy(name, fr->fr_Drawer, 256);
  736.       AddPart(name, fr->fr_File, 256);
  737.     }
  738.  
  739.     FreeAslRequest(fr);
  740.   }
  741.  
  742.   return result;
  743. }
  744.  
  745.  
  746. /*
  747.  *  Einstellungen laden
  748.  */
  749.  
  750. void OpenPrefs(Preferences *p)
  751. {
  752.   BPTR fh;
  753.  
  754.   if (fh = Open(PrefsName, MODE_OLDFILE)) {
  755.     Read(fh, p, sizeof(Preferences));
  756.     Close(fh);
  757.  
  758.     // Altes drv_?_is_IEC konvertieren
  759.     if (p->drv_8_type == 0xffff)
  760.       p->drv_8_type = DRVTYPE_IEC;
  761.     if (p->drv_9_type == 0xffff)
  762.       p->drv_9_type = DRVTYPE_IEC;
  763.     if (p->drv_10_type == 0xffff)
  764.       p->drv_10_type = DRVTYPE_IEC;
  765.     if (p->drv_11_type == 0xffff)
  766.       p->drv_11_type = DRVTYPE_IEC;
  767.  
  768.     // Altes use_SID_card konvertieren
  769.     if (p->SID_type == 0xffff)
  770.       p->SID_type = SIDTYPE_CARD;
  771.   }  
  772. }
  773.  
  774.  
  775. /*
  776.  *  Einstellungen laden (Dateirequester, ändert PrefsName)
  777.  */
  778.  
  779. void open_prefs_as(Preferences *p)
  780. {
  781.   if (request_file(PrefsWnd, PrefsName, MSG_PREFSHAIL, FALSE)) {
  782.     OpenPrefs(p);
  783.     set_gadgets(p);
  784.   }
  785. }
  786.  
  787.  
  788. /*
  789.  *  Einstellungen unter aktuellem Namen speichern
  790.  */
  791.  
  792. void save_prefs(Preferences *p)
  793. {
  794.   BPTR fh;
  795.   struct DiskObject *dobj;
  796.  
  797.   get_gadgets(p);
  798.  
  799.   if (fh = Open(PrefsName, MODE_NEWFILE)) {
  800.     Write(fh, p, sizeof(Preferences));
  801.     Close(fh);
  802.  
  803.     if (dobj = GetDiskObject(PrefsName))
  804.       FreeDiskObject(dobj);
  805.     else
  806.       PutDiskObject(PrefsName, &PrefsIcon);
  807.   }
  808. }
  809.  
  810.  
  811. /*
  812.  *  Einstellungen speichern (Dateirequester, ändert PrefsName)
  813.  */
  814.  
  815. void save_prefs_as(Preferences *p)
  816. {
  817.   if (request_file(PrefsWnd, PrefsName, MSG_PREFSHAIL, TRUE))
  818.     save_prefs(p);
  819. }
  820.  
  821.  
  822. /*
  823.  *  Lokalisierungen vornehmen
  824.  */
  825.  
  826. const int gadget_table[] = {
  827.   GDX_OK, MSG_OK_GAD,
  828.   GDX_Save, MSG_SAVE_GAD,
  829.   GDX_Cancel, MSG_CANCEL_GAD,
  830.   GDX_Joystick1On, MSG_JOYSTICK1ON_GAD,
  831.   GDX_Joystick2On, MSG_JOYSTICK2ON_GAD,
  832.   GDX_JoystickSwap, MSG_JOYSTICKSWAP_GAD,
  833.   GDX_GetDisplayID, MSG_GETDISPLAYID_GAD,
  834.   GDX_DisplayID, MSG_DISPLAYID_GAD,
  835.   GDX_ScreenType, MSG_SCREENTYPE_GAD,
  836.   GDX_NormalCycles, MSG_NORMALCYCLES_GAD,
  837.   GDX_BadLineCycles, MSG_BADLINECYCLES_GAD,
  838.   GDX_CIACycles, MSG_CIACYCLES_GAD,
  839.   GDX_Drv8Type, MSG_DIR8_GAD,
  840.   GDX_Drv9Type, MSG_DIR9_GAD,
  841.   GDX_Drv10Type, MSG_DIR10_GAD,
  842.   GDX_Drv11Type, MSG_DIR11_GAD,
  843.   GDX_SIDType, MSG_SIDTYPE_GAD,
  844.   GDX_OtherIEC, MSG_OTHERIEC_GAD,
  845.   GDX_KeyboardYZ, MSG_KEYBOARDYZ_GAD,
  846.   GDX_SpritesOn, MSG_SPRITESON_GAD,
  847.   GDX_Collisions, MSG_COLLISIONS_GAD,
  848.   GDX_MapSlash, MSG_MAPSLASH_GAD,
  849.   GDX_FastReset, MSG_FASTRESET_GAD,
  850.   GDX_SkipLatch, MSG_SKIPLATCH_GAD,
  851.   GDX_LimitSpeed, MSG_LIMITSPEED_GAD,
  852.   GDX_DirectVideo, MSG_DIRECTVIDEO_GAD,
  853.   -1
  854. };
  855.  
  856. void LocalizePrefs(void)
  857. {
  858.   int i;
  859.  
  860.   about_req.es_Title = GetStr(IsFrodoSC ? MSG_ABOUTTITLESC : MSG_ABOUTTITLE);
  861.   about_req.es_TextFormat = GetStr(IsFrodoSC ? MSG_ABOUTSC_REQ : MSG_ABOUT_REQ);
  862.   about_req.es_GadgetFormat = GetStr(MSG_REQGADS5);
  863.  
  864.   PrefsWdt = GetStr(MSG_PREFSTITLE);
  865.  
  866.   PrefsNewMenu[0].nm_Label = GetStr(MSG_PROJECT_MENU);
  867.   PrefsNewMenu[1].nm_Label = GetStr(MSG_OPEN_MENU);
  868.   PrefsNewMenu[3].nm_Label = GetStr(MSG_SAVE_MENU);
  869.   PrefsNewMenu[4].nm_Label = GetStr(MSG_SAVEAS_MENU);
  870.   PrefsNewMenu[6].nm_Label = GetStr(IsFrodoSC ? MSG_ABOUTSC_MENU : MSG_ABOUT_MENU);
  871.   PrefsNewMenu[8].nm_Label = GetStr(MSG_OK_MENU);
  872.   PrefsNewMenu[9].nm_Label = GetStr(MSG_CANCEL_MENU);
  873.  
  874.   for (i=0; gadget_table[i]>=0; i+=2)
  875.     PrefsNGad[gadget_table[i]].ng_GadgetText = GetStr(gadget_table[i+1]);
  876.  
  877.   SIDType0Labels[0] = GetStr(MSG_SIDTYPEOFF_LAB);
  878.   SIDType0Labels[1] = GetStr(MSG_SIDTYPECARD_LAB);
  879.   SIDType0Labels[2] = GetStr(MSG_SIDTYPEA64_LAB);
  880.   SIDType0Labels[3] = GetStr(MSG_SIDTYPEPSID_LAB);
  881. }
  882.